home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / stoe / stoe.c next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  7.4 KB  |  262 lines

  1. /*--------------------------------------------------------------------*
  2.  *  stoe.c = SJIS --> EUC                             Ver. 2.4  L. 00 *
  3.  *                                                                    *
  4.  *   MS-DOS (or UNIX)                                                 *
  5.  *                                                                    *
  6.  *   MS-C Ver. 6.00                                                   *
  7.  *                                                                    *
  8.  *   create      1989.03     KU666                                    *
  9.  *   modify      1993.02.19  KU666                                    *
  10.  *                                                                    *
  11.  *--------------------------------------------------------------------*/
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <process.h>
  15.  
  16. #define  MS_DOS       1
  17.  
  18. #if MS_DOS
  19. #include <io.h>
  20. #include <dos.h>
  21. #endif
  22.  
  23. #define  LINE_MAX     65535
  24. #define  BUFF_MAX       256
  25. #define  PATH_MAX        80
  26.  
  27. #if TC
  28. #define  EXDEV      ENOTSAM
  29. #endif
  30.  
  31. #define  OFF          0
  32. #define  ON           1
  33. #define  VER          "2.4"
  34.  
  35. unsigned char  buff1[BUFF_MAX], buff2[BUFF_MAX];
  36. char           com1[PATH_MAX], temp[PATH_MAX];
  37. int            file_cnt;
  38. int            not_kanji,               /* ATT 漢字コード外 */
  39.                opt_flg,                 /*                  */
  40.                owrt_flg,                /* over write flag  */
  41.                name_flg;                /*                  */
  42. FILE           *fp1, *fp2;
  43.  
  44. void err_msg1(void);
  45. void para_chk(char *[]);
  46. void file_open(char *[]);
  47. void kana_cnv(int *, int *);
  48. void kanji_cnv(int *, int *);
  49. void file_mv(char *, char *);
  50. void err_msg2(char *[]);
  51.  
  52. main (int argc, char *argv[])
  53. {
  54.     unsigned   i;
  55.     static int j, k;
  56.  
  57.     strcpy(temp, "wk_____");
  58.  
  59.     if (argc == 1) {
  60.         err_msg1();
  61.     }
  62.     para_chk(argv);
  63.  
  64.     for (file_cnt = 1+opt_flg; file_cnt < argc; file_cnt++) {
  65.  
  66.         file_open(argv);
  67.  
  68.         for (i = 0; i < LINE_MAX; i++) {
  69.             if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
  70.                 break;
  71.             }
  72.             for (j = 0, k = 0; j < BUFF_MAX; j++, k++) {
  73.                 buff2[k] = buff1[j];
  74.                 if (buff1[j] == (unsigned char)NULL) {
  75.                     break;
  76.                 }
  77.                 if (0xa0 <= buff1[j] && buff1[j] <= 0xdf){/* かな */
  78.                     kana_cnv(&j, &k);
  79.                 } else {                                  /* 漢字 */
  80.                     kanji_cnv(&j, &k);
  81.                 }
  82.             }
  83.             fputs(buff2, fp2);          /* write file      */
  84.         }
  85.  
  86.         fclose(fp1);
  87.         if (opt_flg == ON) {
  88.             fclose(fp2);
  89.         }
  90.  
  91.         if (owrt_flg == 1) {            /* file delete     */
  92.             printf("file name = %s\n", argv[file_cnt]);
  93.             file_mv(temp, argv[file_cnt]); /* file mv      */
  94.         }
  95.         err_msg2(argv);                 /* error messge    */
  96.     }
  97.     return (0);
  98. }
  99.  
  100. void para_chk(char *argv[])
  101. {
  102.     opt_flg = owrt_flg = name_flg = OFF;
  103.  
  104.     if (argv[1][0] == '-') {
  105.         opt_flg = ON;
  106.         if (argv[1][1] == 'd') {
  107.             owrt_flg = ON;
  108.         } else if (argv[1][1] == 'D') {
  109.             name_flg = ON;
  110.         } else {
  111.             err_msg1();
  112.         }
  113.     }
  114. }
  115.  
  116. void file_open(char *argv[])
  117. {
  118.     int  i;
  119.     char fname[64];
  120.  
  121.     if (NULL == (fp1 = fopen(argv[file_cnt], "r"))) {
  122.         printf("\n Cannot Open File(1) : %s\n\n", argv[file_cnt]);
  123.         exit(1);
  124.     }
  125.     if (owrt_flg == ON) {               /* -d オプション */
  126.         if (NULL == (fp2 = fopen (temp, "w"))) {
  127.             printf("\n Cannot Open File(2) : %s(%s)\n\n", temp, argv[file_cnt]);
  128.             exit(1);
  129.         }
  130.     } else {
  131.         strcpy(fname, argv[file_cnt+1]);
  132.         if (name_flg == ON) {           /* -D オプション */
  133.             strcpy(fname, argv[file_cnt]);
  134.             for (i = 0; ; i++) {
  135.                if (fname[i] == '.') {
  136.                    strncpy(&fname[i+1], "euc", 4);
  137.                    break;
  138.                } else if (fname[i] == (char)NULL) {
  139.                    strncpy(&fname[i], ".euc", 5);
  140.                    break;
  141.                }
  142.             }
  143.             printf("output file name = %s\n",fname);
  144.             if (NULL == (fp2 = fopen (fname, "w"))) {
  145.                 printf("\n Cannot Open File(3) : %s\n\n", fname);
  146.                 exit(1);
  147.             }
  148.         } else {
  149.             fp2 = stdout;
  150.         }
  151.     }
  152. }
  153.  
  154. void kana_cnv(int *cnt1, int *cnt2)
  155. {
  156.     buff2[*cnt2]   = 0x8e;
  157.     buff2[(*cnt2)+1] = buff1[*cnt1];
  158.     (*cnt2)++;
  159. }
  160.  
  161. void kanji_cnv(int *cnt1, int *cnt2)
  162. {
  163.     unsigned char  tmp, add  = 0;
  164.     int            mode = 0;
  165.  
  166.     if (0x81 <= buff1[*cnt1] && buff1[*cnt1] <= 0x9f) {
  167.         mode = 1;
  168.         tmp  = buff1[*cnt1] - (char)0x81;
  169.     }
  170.     if (0xe0 <= buff1[*cnt1] && buff1[*cnt1] <= 0xfc) {
  171.         mode = 2;
  172.         tmp  = buff1[*cnt1] - (char)0xe0;
  173.     }
  174.     if (mode == 1 || mode == 2) {
  175.         if (buff1[(*cnt1)+1] >= 0x40 && buff1[(*cnt1)+1] <= 0xfc) {
  176.             if (buff1[(*cnt1)+1] >= 0x80 && buff1[(*cnt1)+1] < 0x9f) {
  177.                 buff1[(*cnt1)+1] = buff1[(*cnt1)+1]-(char)1;
  178.             }
  179.             if (buff1[(*cnt1)+1] >= 0x40 && buff1[(*cnt1)+1] <= 0x9e) {
  180.                 buff2[(*cnt2)+1] = buff1[(*cnt1)+1] + (char)0x61;
  181.                 add = (char)(tmp*2+1);
  182.             } else {
  183.                 if (buff1[(*cnt1)+1] >= 0x9f && buff1[(*cnt1)+1] <= 0xfe) {
  184.                     buff2[(*cnt2)+1] = buff1[(*cnt1)+1] + (char)0x02;
  185.                     add = (char)(tmp*2+2);
  186.                 }
  187.             }
  188.             if (mode == 2) {
  189.                 buff2[(*cnt2)+1] = buff1[(*cnt2)+1]+(char)1;
  190.             }
  191.             buff2[*cnt2] = (char)(0xa1 + add-1);
  192.             (*cnt2)++, (*cnt1)++;
  193.         } else {
  194.             not_kanji++;
  195.         }
  196.         mode = 0;
  197.     }
  198. }
  199.  
  200. #if MS_DOS
  201. void file_mv(char *old, char *new)      /* MS-DOS */
  202. {
  203.     int  ret;
  204.  
  205.     ret = remove(new);
  206.     if (ret != 0) {
  207.         printf("remove エラー = %d\n", ret);
  208.     }
  209.     ret = rename(old, new);
  210.     if (ret != 0) {
  211.         printf("rename エラー = %d\n", ret);
  212.     }
  213. }
  214. #endif
  215.  
  216. #if UNIX
  217. void file_mv(char *old, char *new)      /* UNIX */
  218. {
  219.     unsigned int   i;
  220.     int            j;
  221.  
  222.     if (NULL == (fp1 = fopen (old, "r"))) {
  223.         exit(1);
  224.     }
  225.     if (NULL == (fp2 = fopen (new, "w"))) {
  226.         exit(1);
  227.     }
  228.     for (i = 0; i < LINE_MAX; i++) {
  229.         if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
  230.             break;
  231.         }
  232.         for (j = 0; j < BUFF_MAX; j++) {
  233.             buff2[j] = buff1[j];
  234.          }
  235.         fputs(buff2, fp2);
  236.     }
  237.     fclose(fp1);
  238.     fclose(fp2);
  239.     sprintf(com1, "rm %s", old);
  240.     system(com1);                       /* file delete     */
  241. }
  242. #endif
  243.  
  244. void err_msg1(void)
  245. {
  246.     printf("stoe (Ver. %s)\n" , VER);
  247.     printf("Usage: stoe [-d|-D] <filename>...\n");
  248.     printf("\nEx.)\n");
  249.     printf(" stoe <filename>...\n");
  250.     printf(" stoe -d filename      (Over Wriete)\n");
  251.     printf(" stoe -D filename      (xxxxxxxx.euc)\n");
  252.     exit(1);
  253. }
  254.  
  255. void err_msg2(char *argv[])             /* error messge */
  256. {
  257.     if (not_kanji != 0) {
  258.         printf ("\n%s : count of bad KANJI code pair(s)= %d\n",
  259.                   argv[file_cnt], not_kanji);
  260.     }
  261. }
  262.